home *** CD-ROM | disk | FTP | other *** search
- /* getrecord.rexx
-
- This is a rexxscript to scan for pascal records.
-
- I made this one to check my translation of
- cheaders to fpc units. It will write two
- files one pascalfile and one cfile.
-
- The pascalfile you can almost everytime just
- compile with fpc. In the cfile you have to
- make some changes, just put in a line that
- include the cheader for you testprogram.
-
- So if you translate a cheader to fpc just
- let this script check it out, if you get
- the same result from both program you have
- probably made the translation correct.
-
- Usage:
-
- rx getrecord yourunit.pas
-
- nils.sjoholm@mailbox.swipnet.se
-
- */
-
-
- SIGNAL ON BREAK_C
- SIGNAL ON SYNTAX
-
- parse arg name
-
- if name = '' then do
- say 'Input filename to scan for records'
- parse pull name end
- if name = '' then do
- say 'Error no filename'
- exit 20
- end
- end
-
- k = 1
-
- thesource = name
-
- if index(name,'.') > 0 then do
- parse var name thesource '.' extension
- end
-
- pasname = thesource || 'rec1.pas'
- cname = thesource || 'rec2.c'
-
- IF ~Open('textfile',name,'READ') THEN DO
- say 'File not found'
- exit 20
- end
- else do
- say 'Scanning ' || name
- i = 1
- DO WHILE ~eof('textfile')
- line.i = ReadLn('textfile')
- line.i = Strip(line.i)
- myproc = Word(line.i,3)
- myproc = Upper(myproc)
- IF myproc = "RECORD" THEN DO
- CALL CheckLine(line.i)
- SAY "Doing line :" || i
- END
- i = i +1
- END
- CALL Close('textfile')
- if k > 1 then do
- call writepasfile
- call writecfile
- say 'Done'
- end
- else say 'No records found'
- END
- EXIT
-
- pasheader:
- writeln('outfile','Program testrecords;')
- writeln('outfile','')
- writeln('outfile','uses exec,' || thesource || ';')
- writeln('outfile','')
- writeln('outfile','begin')
- return
-
- writepasfile:
- if ~Open('outfile',pasname,'W') then do
- say 'Can not create file'
- exit 20
- end
- else do
- SAY "Working on " || pasname
- call pasheader
- do j = 1 to k-1
- thename = record.j
- towrite = 'writeln(' || "'" || thename || "',' ':30-length(" || "'" ||thename || "'),"
- towrite = towrite || "':'"
- towrite = towrite || ',sizeof(' || thename || '));'
-
- writeln('outfile',towrite)
- end j
- writeln('outfile','end.')
- writeln('outfile','')
- CALL Close('outfile')
-
- RETURN
-
- cheader:
- writeln('outfile','');
- writeln('outfile','#include ' || '"stdio.h"')
- writeln('outfile','')
- writeln('outfile','main()')
- writeln('outfile','{')
- return
-
- writecfile:
- if ~Open('outfile',cname,'W') then do
- say 'Can not create file'
- exit 20
- end
- else do
- SAY "Working on " || cname
- call cheader
- do j = 1 to k-1
- thename = record.j
- towrite = 'printf(' || '"%-30s:%d\n","' || thename || '",'
- towrite = towrite || 'sizeof(struct ' || right(thename,length(thename)-1) ||'));'
-
- writeln('outfile',towrite)
- end j
- writeln('outfile','}')
- writeln('outfile','')
-
- CALL Close('outfile')
- return
-
- CheckLine:
- PARSE ARG theline
- parse var theline thename thesep therecord therest
- if thesep = '=' then do
- thename = strip(thename)
- record.k = thename
- k = k +1
- end
- RETURN
-
-
-
- BREAK_C:
- SYNTAX:
- SAY "Sorry, error line" SIGL ":" ErrorText(RC) ":-("
- EXIT
-
-
-